﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Entidades.Sistema.Venta;
using Entidades.Seguridad;
using Modelo.Sistema.Venta;
using DevExpress.Web.ASPxEditors;
using DevExpress.Web.Mvc;
using VistaOnlineR1._1.Helpers;
using VistaOnlineR1._1.Models.Ventas.Pedido;


namespace VistaOnlineR1._1.Controllers.Sistema.Venta
{
    public class PedidosController : BaseController
    {
        #region campos
        CatalogoPedidos _catalogoPedidos;
        CatalogoCliente _catalogoCliente;
        CatalogoProductos _catalogoProductos;
        #endregion
        
        #region Constructors
        public PedidosController()
            : this(new CatalogoPedidos(),new CatalogoCliente(), new CatalogoProductos())
        {
        }

        public PedidosController(CatalogoPedidos catalogoPedidos, CatalogoCliente catalogoCliente, CatalogoProductos catalogoProductos)
        {
            _catalogoPedidos = catalogoPedidos;
            _catalogoCliente = catalogoCliente;
            _catalogoProductos = catalogoProductos;
        }
        #endregion


        #region acciones
        public ActionResult Index()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));

            ViewBag.Cliente = _catalogoCliente.ListarCliente();
            return View(_catalogoPedidos.ListarPedidos());
        }

        //metodos cabecera
        [ValidateInput(false)]
        public ActionResult EditPedidosPartial(int? idcliente)
        {
            List<Perfil> perfiles = RecuperarPerfil();

            string idsession = "Pedido";
            Pedido oPedido = new Pedido();
            System.Web.HttpContext.Current.Session[idsession] = oPedido;

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
                        
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));

            if (idcliente != null)
            {
                ViewBag.IdCliente = idcliente;
                ViewBag.Cliente = _catalogoCliente.ListarCliente().Where(x => x.IdCliente == (int)idcliente);
                return PartialView("EditPedidosPartial",_catalogoPedidos.ListarPedidos().Where(x => x.Cliente.IdCliente == (int)idcliente));
            }

            ViewBag.Cliente = _catalogoCliente.ListarCliente();
            return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos());
        }
        public ActionResult EditPedidosAddNewPartial(Pedido PedidoEdit, int? idcliente)
        {

            int ret = 0;
            string idsession = "Pedido";

            if (idcliente != null)
            {
                PedidoEdit.Cliente.IdCliente = (int)idcliente;
            }
            else
            {
                int idclientes = String.IsNullOrEmpty(Request.Params["idcliente"]) ? -1 : int.Parse(Request.Params["idcliente_VI"]);
                if (idclientes != -1)
                { PedidoEdit.Cliente = _catalogoCliente.BuscarCliente(idclientes); }
                else { ModelState.AddModelError("idclientes", "Seleccione el cliente"); }
            }

            ModelState.Clear();
            if (ModelState.IsValid)
            {   
                PedidoEdit.Cliente = _catalogoCliente.BuscarCliente(PedidoEdit.Cliente.IdCliente);
                PedidoEdit.Fecha = DateTime.UtcNow.Date;
                PedidoEdit.Estado = PedidosEstado.Creado;

                Pedido oPedido = (Pedido)System.Web.HttpContext.Current.Session[idsession];

                if (oPedido.DetallePedidos.Count > 0)
                {
                    foreach (DetallePedido det in oPedido.DetallePedidos)
                    {
                        PedidoEdit.AgregarDetalle(det);
                    }

                    PoliticaDeDescuento pol = new PoliticaDeDescuento();

                    PedidoEdit.ImporteDescuento = pol.DevolverDescuento(PedidoEdit.Cliente.TipoCliente.IdTipoCliente, PedidoEdit.Total);

                    ret = _catalogoPedidos.AgregarPedido(PedidoEdit);                
                }
                else
                {
                    ViewData["PedidoEdit"] = PedidoEdit;
                    ViewData["EditError"] = "No existe detalle para el pedido.";
                }
            }
            else
            {
                ViewData["PedidoEdit"] = PedidoEdit;
                ViewData["EditError"] = "Por Favor, modifica los errores.";
            }

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));
            ViewBag.Cliente = _catalogoCliente.ListarCliente();
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewData["Pedido"] = ret;

            if (idcliente != null)
            {
                ViewBag.IdCliente = idcliente;
                ViewBag.Cliente = _catalogoCliente.ListarCliente().Where(x => x.IdCliente == (int)idcliente);
                return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos().Where(x => x.Cliente.IdCliente == (int)idcliente));
            }

            return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos().OrderBy(x => x.Cliente.Nombre));
        }
        public ActionResult EditPedidosUpdatePartial([ModelBinder(typeof(DevExpressEditorsBinder))] Pedido PedidoEdit, int? idcliente)
        {
            ModelState.Clear();
            if (ModelState.IsValid)
            {
                Pedido oPedidoUpdate = _catalogoPedidos.BuscarPedido(PedidoEdit.IdPedido);

                if (idcliente != null)
                {
                    PedidoEdit.Cliente.IdCliente = (int)idcliente;
                }
                else
                {
                    int idclientes = String.IsNullOrEmpty(Request.Params["idcliente"]) ? -1 : int.Parse(Request.Params["idcliente_VI"]);
                    if (idclientes != -1)
                    { PedidoEdit.Cliente = _catalogoCliente.BuscarCliente(idclientes); }
                    else { ModelState.AddModelError("idclientes", "Seleccione el cliente"); }
                }

                oPedidoUpdate.Cliente = _catalogoCliente.BuscarCliente(PedidoEdit.Cliente.IdCliente);
                oPedidoUpdate.FechaEntrega = PedidoEdit.FechaEntrega;
                PoliticaDeDescuento pol = new PoliticaDeDescuento();
                oPedidoUpdate.ImporteDescuento = pol.DevolverDescuento(oPedidoUpdate.Cliente.TipoCliente.IdTipoCliente, oPedidoUpdate.Total);
                _catalogoPedidos.ModificarPedido(oPedidoUpdate);
                ViewData["Pedido"] = oPedidoUpdate.IdPedido;
            }
            else
            {
                ViewData["EditError"] = "No se pudieron guardar los cambio. Exiten errores!";
                ViewData["PedidoEdit"] = PedidoEdit;
            }

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));
            ViewBag.Cliente = _catalogoCliente.ListarCliente();
            ViewBag.Producto = _catalogoProductos.ListarProductos();

            if (idcliente != null)
            {
                ViewBag.IdCliente = idcliente;
                ViewBag.Cliente = _catalogoCliente.ListarCliente().Where(x => x.IdCliente == (int)idcliente);
                return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos().Where(x => x.Cliente.IdCliente == (int)idcliente));
            }

            return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos().OrderBy(x => x.Cliente.Nombre));
        }
        public ActionResult EditPedidosDeletePartial(int IdPedido, int? idcliente)
        {
          

            _catalogoPedidos.EliminarPedido(_catalogoPedidos.BuscarPedido(IdPedido));
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Cliente = _catalogoCliente.ListarCliente();
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));

           
            if (idcliente != null)
            {
                ViewBag.IdCliente = idcliente;
                ViewBag.Cliente = _catalogoCliente.ListarCliente().Where(x => x.IdCliente == (int)idcliente);
                return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos().Where(x => x.Cliente.IdCliente == (int)idcliente));
            }

            return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos());
        }
        public ActionResult EditPedidosCancelPartial(int? IdPedido, int? idcliente)
        {
            if (IdPedido != -1 && IdPedido != null)
            {
                _catalogoPedidos.CancelarEdicionPedido((int)IdPedido);
            }
            
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Cliente = _catalogoCliente.ListarCliente();
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));

            if (idcliente != null)
            {
                ViewBag.IdCliente = idcliente;
                ViewBag.Cliente = _catalogoCliente.ListarCliente().Where(x => x.IdCliente == (int)idcliente);
                return PartialView("EditPedidosPartial", _catalogoPedidos.ListarPedidos().Where(x => x.Cliente.IdCliente == (int)idcliente));
            }

            return RedirectToAction("Index");
        }

        //metodos detalle
        public ActionResult EditPedidoDetallePartialVista(int IdPedido)
        {
            var idcliente = TempData["IdCliente"];
            
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(StatesDetalle));
            ViewData["IdPedido"] = IdPedido;
            TempData["IdCliente"] = idcliente;

            Pedido oPedido = new Pedido();
            if (IdPedido != 0)
            {               
                oPedido = _catalogoPedidos.BuscarPedido(IdPedido);
            }

            return PartialView("EditPedidoDetallePartialVista", oPedido.DetallePedidos);
        }
        public ActionResult EditPedidoDetallePartial(int IdPedido)
        {
            string idsession = "Pedido";
            Pedido oPedido = new Pedido();
            oPedido = (Pedido)System.Web.HttpContext.Current.Session[idsession];

            if (IdPedido != 0)
            {
                //hacer tod en un if
                if (oPedido == null)
                {
                    oPedido = _catalogoPedidos.BuscarPedido(IdPedido);
                }
                else if (oPedido.IdPedido != IdPedido)
                {
                    oPedido = _catalogoPedidos.BuscarPedido(IdPedido);
                }
            }
            else if(oPedido == null)
            {
                oPedido = new Pedido(); 
            }

            System.Web.HttpContext.Current.Session[idsession] = oPedido;

            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(StatesDetalle));
            ViewData["IdPedido"] = IdPedido;

            return PartialView("EditPedidoDetallePartial", oPedido.DetallePedidos);
        }
        public ActionResult EditPedidoDetalleAddNewPartial([ModelBinder(typeof(DevExpressEditorsBinder))] DetallePedido det, int IdPedido)
        {
            string idsession = "Pedido";
            Pedido oPedido = new Pedido();
            oPedido = (Pedido)System.Web.HttpContext.Current.Session[idsession];
            
            //Todo
            ModelState.Clear();
            if (ModelState.IsValid)
            {
                if (oPedido.DetallePedidos.Any(x => x.Producto.IdProducto == det.Producto.IdProducto))
                {
                    ViewData["EditError"] = "El Producto selecciona ya existe en la lista.";
                }
                else
                {
                    det.Producto = _catalogoProductos.BuscarProducto(det.Producto.IdProducto);
                    det.IdDetallePedido = det.Producto.IdProducto;
                    det.Estado = StatesDetalle.PendienteDiagramacion;
                    oPedido.DetallePedidos.Add(det);
                }
            }
            else 
            {
                ViewData["EditError"] = "Por Favor, modifica los errores.";
            }

            System.Web.HttpContext.Current.Session[idsession] = oPedido;

            ViewData["IdPedido"] = IdPedido;
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(StatesDetalle));

            return PartialView("EditPedidoDetallePartial", oPedido.DetallePedidos);
        }
        public ActionResult EditPedidoDetalleUpdatePartial([ModelBinder(typeof(DevExpressEditorsBinder))] DetallePedido det, int IdPedido)
        {
            string idsession = "Pedido";
            Pedido oPedido = (Pedido)System.Web.HttpContext.Current.Session[idsession];
            ModelState.Clear();
            if (ModelState.IsValid)
            {
                oPedido.DetallePedidos.Remove(oPedido.DetallePedidos.FirstOrDefault(x => x.IdDetallePedido == det.IdDetallePedido));
                det.Producto = _catalogoProductos.BuscarProducto(det.Producto.IdProducto);
                det.IdDetallePedido = det.Producto.IdProducto;
                det.Estado = det.Estado;
                oPedido.DetallePedidos.Add(det);
            }
            else
            {
                ViewData["EditError"] = "Por Favor, modifica los errores.";
            }

            System.Web.HttpContext.Current.Session[idsession] = oPedido;

            ViewData["IdPedido"] = IdPedido;
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(StatesDetalle));            

            return PartialView("EditPedidoDetallePartial", oPedido.DetallePedidos);
        }
        public ActionResult EditPedidoDetalleDeletePartial(int IdDetallePedido, int IdPedido)
        {
            string idsession = "Pedido";
            Pedido oPedido = (Pedido)System.Web.HttpContext.Current.Session[idsession];

            oPedido.DetallePedidos.Remove(oPedido.DetallePedidos.FirstOrDefault(x => x.IdDetallePedido == IdDetallePedido));


            ViewData["IdPedido"] = IdPedido;
            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewBag.Estado = Enum.GetValues(typeof(StatesDetalle));

            return PartialView("EditPedidoDetallePartial", oPedido.DetallePedidos);
        }
        #endregion
                

        [HttpGet]
        public ActionResult PedidosPorBarriosViews()
        {
            ViewData[GragicoHelper.OptionsKey] = new GraficoTortaAnilloViewsOptions();
            return View("PedidosPorBarriosViews", PedidoReporteModels.ObtenerDatosReportePedidosPorBarrio() );
        }
        [HttpPost]
        public ActionResult PedidosPorBarriosViews([Bind] GraficoTortaAnilloViewsOptions options)
        {
            ViewData[GragicoHelper.OptionsKey] = options;
            return View("PedidosPorBarriosViews", PedidoReporteModels.ObtenerDatosReportePedidosPorBarrio());
        }

        //Imprimir
        public ActionResult ImprimirPedido(int IdPedido)
        {
            string idsession = "PedidoAImprimir";
            Pedido oPedido = new Pedido();
            oPedido = _catalogoPedidos.BuscarPedido(IdPedido);

            System.Web.HttpContext.Current.Session[idsession] = oPedido;
            return View();
        }
        public ActionResult ImprimirPedidoPartial()
        {
            string idsession = "PedidoAImprimir";
            string idsessionreporte = "Reporte";

            Pedido oPedido = (Pedido)System.Web.HttpContext.Current.Session[idsession];

            Reportes.rptPedido rpt = new Reportes.rptPedido();

            rpt.DataSource = _catalogoPedidos.ListarPedidos().Where(x => x.IdPedido == oPedido.IdPedido).ToList();
            ViewData["Report"] = rpt;
            System.Web.HttpContext.Current.Session[idsessionreporte] = rpt;


            return PartialView("ImprimirPedidoPartial");
        }
        public ActionResult ImprimirPedidoExportTo()
        {
            string idsessionreporte = "Reporte";
            Reportes.rptPedido rpt = (Reportes.rptPedido)System.Web.HttpContext.Current.Session[idsessionreporte];
            return DocumentViewerExtension.ExportTo(rpt);
        }        

        public ActionResult EnvioFacturacion(int IdPedido)
        {
            string idsession = "FacturacionEnvio";
            Pedido oPedido = new Pedido();
            oPedido = _catalogoPedidos.BuscarPedido(IdPedido);

            if (oPedido.Estado.ToString() != PedidosEstado.Entregado.ToString() && oPedido.Estado.ToString() != PedidosEstado.Producido.ToString() && oPedido.Estado.ToString() != PedidosEstado.ParcProducido.ToString())
            {
                ViewBag.Estado = "El pedido aun no se puede facturar";

                return View();
            }

            _catalogoPedidos.ModificarPedidoAFacturado(oPedido);

            System.Web.HttpContext.Current.Session[idsession] = oPedido;
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));
            ViewBag.Cliente = _catalogoCliente.ListarCliente();
            ViewBag.Producto = _catalogoProductos.ListarProductos();

            ViewBag.Estado = "El pedido se envio a facturacion";

            return View();
        }
    }
}
